
package View;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

/**
 * Panel w którym są widoczne aktualne zadania pobierania plików.
 * @param layout - box layout
 * @param Box - box w którym są umieszczone pozostałe komponenty.
 * @param JScrollPane - potrzebne do możliwości scrollowania przy dużej ilości zadań.
 * @param ArrayList<Box> - przechowuje kolejne zadania w wierszach.
 * @param view - referencja na widok.
 */
public class Downloading extends JPanel {
    private BoxLayout layout;
    private Box box;
    private JScrollPane scroll;
    private ArrayList<Box> wiersz;
    private final View view;
    
    Downloading(final View view) {
        this.view = view;
        layout = new BoxLayout(this, BoxLayout.X_AXIS);
        this.setLayout(layout);
        box = new Box(BoxLayout.Y_AXIS);
        scroll = new JScrollPane(box);
        wiersz = new ArrayList<>();              
        box.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                    Box currentItem = (Box)box.getComponentAt(e.getX(), e.getY());
                    try {
                        if(!(currentItem.getComponent(0) instanceof Box)) {
                        ((JLabel)currentItem.getComponent(0)).setForeground(Color.red);
                        repaint();
                        if(JOptionPane.showConfirmDialog(null, "Czy na pewno chcesz usunąć to zadanie z listy?","Usuwanie zadania.", JOptionPane.OK_CANCEL_OPTION) == 0) {
                            if(((JProgressBar)currentItem.getComponent(2)).getValue() == 100) {
                              removeDownload(currentItem);
                            }
                            else {
                              view.showError("Nie można usunąć nieukończonego zadania!");
                            }
                        }
                        ((JLabel)currentItem.getComponent(0)).setForeground(Color.black);
                        repaint(); 
                       }
                    }
                    catch(IndexOutOfBoundsException ex) { }
                    
                    
                }
            }
        );
        this.add(scroll);    
    }
    /**
     * Funkcja dodaje nowe zadanie do listy pobierania.
     * @param title - nazwa pliku.
     */
    public void addNewDownload(String title) {
            JProgressBar bar = new JProgressBar();
            bar.setStringPainted(true);
            bar.setPreferredSize(new Dimension(100, 30));
            bar.setMaximumSize(bar.getPreferredSize());
            wiersz.add(new Box(BoxLayout.X_AXIS).createHorizontalBox());
            wiersz.get(wiersz.size() -1 ).add(new JLabel(title));
            wiersz.get(wiersz.size() -1 ).add(Box.createHorizontalGlue());
            wiersz.get(wiersz.size() -1 ).add(bar);
            box.add(wiersz.get(wiersz.size() -1), null);
            this.revalidate();
    }
    /**
     * Aktualizuje postęp konkretnego zadania.
     * @param title nazwa pliku / zadania
     * @param val nowa wartość postępu.
     */
    public void updateDownloadProgress(String title, int val) {
        int count = 0;
        for(Box currentBox : wiersz) {
        JLabel l = (JLabel)(currentBox.getComponent(0));
            if(l.getText().equals(title)) {
              ((JProgressBar)wiersz.get(count).getComponent(2)).setValue(val);
            }
            count++;
        } 
    }
    /**
     * Usuwa zadanie z listy.
     * @param b referencja na usuwany wiersz.
     */
    public void removeDownload(Box b) {
        box.remove(b);
        wiersz.remove(b);
        this.repaint();
        this.revalidate();
    }
    /**
     * Sprawdza czy zadanie o danym tytule znajduje się już na liście
     * @param title tytuł zadania.
     * @return prawda jeżeli zadanie znajduje się na liście, falsz w przeciwnym przypadku.
     */
    public boolean exists(String title) {
        int count = 0;
        boolean found = false;
        for(Box currentBox : wiersz) {
        JLabel l = (JLabel)(currentBox.getComponent(0));
          if(l.getText().equals(title)) {
            found = true;
          }
          count++;
        }
        return found;
    }
}
